{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Active Learning\n",
    "Active learning is an iterative process where a model actively selects the most informative data points to be labeled by an oracle (e.g. a human expert), optimizing the model's performance with fewer labeled samples. Active learning can be implemented with Chemprop through Python as demonstrated by this notebook."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/chemprop/chemprop/blob/main/examples/active_learning.ipynb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Install chemprop from GitHub if running in Google Colab\n",
    "import os\n",
    "\n",
    "if os.getenv(\"COLAB_RELEASE_TAG\"):\n",
    "    try:\n",
    "        import chemprop\n",
    "    except ImportError:\n",
    "        !git clone https://github.com/chemprop/chemprop.git\n",
    "        %cd chemprop\n",
    "        !pip install .\n",
    "        %cd examples"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Import packages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import random\n",
    "from typing import Tuple\n",
    "\n",
    "from lightning import pytorch as pl\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import torch\n",
    "from torch.utils.data import DataLoader\n",
    "\n",
    "from chemprop import data, featurizers, models, nn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load some data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "chemprop_dir = Path.cwd().parent\n",
    "input_path = (\n",
    "    chemprop_dir / \"tests\" / \"data\" / \"regression\" / \"mol\" / \"mol.csv\"\n",
    ")  # path to your data .csv file\n",
    "df_input = pd.read_csv(input_path)\n",
    "smis = df_input.loc[:, \"smiles\"].values\n",
    "ys = df_input.loc[:, [\"lipo\"]].values\n",
    "all_data = [data.MoleculeDatapoint.from_smi(smi, y) for smi, y in zip(smis, ys)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this notebook we use three sets of data: An starting set of training data, a set of data to select additional training data from, and a set of data to test the model on. The set of data to select additional training data from could be unlabeled, but for this example all the data already has labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "mols = [d.mol for d in all_data]  # RDkit Mol objects are use for structure based splits\n",
    "splitting_indices = data.make_split_indices(mols, \"random\", (0.1, 0.8, 0.1))\n",
    "starting_data, additional_data, test_data = data.split_data_by_indices(all_data, *splitting_indices)\n",
    "starting_data, additional_data, test_data = starting_data[0], additional_data[0], test_data[0]\n",
    "test_loader = data.build_dataloader(data.MoleculeDataset(test_data), shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "During each iteration of active learning, the training data will be split into training and validation sets and packaged into data loaders, so we make a helper function to do this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_dataloaders(trainval_data) -> Tuple[DataLoader]:\n",
    "    trainval_mols = [d.mol for d in trainval_data]\n",
    "    train_indices, _, val_indices = data.make_split_indices(\n",
    "        trainval_mols, \"random\", (0.9, 0.0, 0.1)\n",
    "    )\n",
    "    train_data, val_data, _ = data.split_data_by_indices(\n",
    "        trainval_data, train_indices, val_indices, None\n",
    "    )\n",
    "\n",
    "    train_dset = data.MoleculeDataset(train_data[0])\n",
    "    scaler = train_dset.normalize_targets()\n",
    "\n",
    "    val_dset = data.MoleculeDataset(val_data[0])\n",
    "    val_dset.normalize_targets(scaler)\n",
    "\n",
    "    train_loader = data.build_dataloader(train_dset)\n",
    "    val_loader = data.build_dataloader(val_dset, shuffle=False)\n",
    "    return train_loader, val_loader, scaler"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also define a helper function to construct a chemprop model. Because this is a regression task, the targets of the training data are normalized and the model needs the scaler that was used to unnormalize the predictions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_mpnn(scaler):\n",
    "    output_transform = nn.UnscaleTransform.from_standard_scaler(scaler)\n",
    "    ffn = nn.MveFFN(output_transform=output_transform)\n",
    "    mpnn = models.MPNN(nn.BondMessagePassing(), nn.MeanAggregation(), ffn, batch_norm=False)\n",
    "    return mpnn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also need a lightning trainer to run the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "GPU available: True (mps), used: False\n",
      "TPU available: False, using: 0 TPU cores\n",
      "HPU available: False, using: 0 HPUs\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/setup.py:177: GPU available but not used. You can set it by doing `Trainer(accelerator='gpu')`.\n"
     ]
    }
   ],
   "source": [
    "trainer = pl.Trainer(\n",
    "    logger=False, enable_progress_bar=False, accelerator=\"cpu\", devices=1, max_epochs=20\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Change active learning parameters here"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A priority function (or acquistition function) guides the active learning process by selecting the most informative data points to label next. A good choice for such a function is the uncertainty of a model's output on each data point."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# rank datapoints based on priority, priority determined by variance\n",
    "def priority_function(mpnn, datapoint):\n",
    "    dataset = data.MoleculeDataset([datapoint])\n",
    "    loader = data.build_dataloader(dataset, batch_size=1)\n",
    "    output = trainer.predict(mpnn, loader)\n",
    "    output = torch.concat(output, dim=0)\n",
    "    return output[..., 1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If our additional data was unlabeled, we would need a way to get the labels for the selected data points. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# the oracle takes a list of potentially unlabeled datapoints to be labeled for the next active learning iteration.\n",
    "def request_labels(new_data):\n",
    "    # adding new data labels:\n",
    "    # for datapoint in new_data:\n",
    "    #     datapoint.y = {label}\n",
    "    return"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lastly, we also need to decide how many data points to add to our training set in each iteration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# number of new datapoints added to trainval pool each iteration.\n",
    "query_size = len(additional_data) // 8"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Start training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We start by training a model on the initial training data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Dropping last batch of size 1 to avoid issues with batch normalization (dataset size = 1, batch_size = 64)\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/utilities/data.py:105: Total length of `DataLoader` across ranks is zero. Please make sure this was your intention.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n"
     ]
    }
   ],
   "source": [
    "train_loader, val_loader, scaler = get_dataloaders(starting_data)\n",
    "mpnn = get_mpnn(scaler)\n",
    "trainer.fit(mpnn, train_loader, val_loader)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can start the active learning loop. In each iteration, we train a model on the current training data, use the model to select the most informative data points (the ones where the model is least certain), add them to the training data, and repeat."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">    1.2045652866363525     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m   1.2045652866363525    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">    0.9172996282577515     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m   0.9172996282577515    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">    1.0593369007110596     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m   1.0593369007110596    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">     1.151768445968628     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m    1.151768445968628    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">    1.2037131786346436     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m   1.2037131786346436    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">    1.1304174661636353     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m   1.1304174661636353    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">    1.0078696012496948     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m   1.0078696012496948    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:475: Your `predict_dataloader`'s sampler has shuffling enabled, it is strongly recommended that you turn shuffling off for val/test dataloaders.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'predict_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:654: Checkpoint directory /Users/brianli/Documents/chemprop/examples/checkpoints exists and is not empty.\n",
      "Loading `train_dataloader` to estimate number of stepping batches.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "\n",
      "  | Name            | Type               | Params | Mode \n",
      "---------------------------------------------------------------\n",
      "0 | message_passing | BondMessagePassing | 227 K  | train\n",
      "1 | agg             | MeanAggregation    | 0      | train\n",
      "2 | bn              | Identity           | 0      | train\n",
      "3 | predictor       | MveFFN             | 90.9 K | train\n",
      "4 | X_d_transform   | Identity           | 0      | train\n",
      "5 | metrics         | ModuleList         | 0      | train\n",
      "---------------------------------------------------------------\n",
      "318 K     Trainable params\n",
      "0         Non-trainable params\n",
      "318 K     Total params\n",
      "1.274     Total estimated model params size (MB)\n",
      "24        Modules in train mode\n",
      "0         Modules in eval mode\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n",
      "`Trainer.fit` stopped: `max_epochs=20` reached.\n",
      "/opt/anaconda3/envs/chemprop/lib/python3.11/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:424: The 'test_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=7` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│<span style=\"color: #008080; text-decoration-color: #008080\">         test/mse          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">    0.9942679405212402     </span>│\n",
       "└───────────────────────────┴───────────────────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│\u001b[36m \u001b[0m\u001b[36m        test/mse         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m   0.9942679405212402    \u001b[0m\u001b[35m \u001b[0m│\n",
       "└───────────────────────────┴───────────────────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "trainval_data = starting_data\n",
    "results = []\n",
    "\n",
    "for _ in range(len(additional_data) // query_size):\n",
    "    # sort new datapoints by priority using priority function\n",
    "    priority_remaining_data = [\n",
    "        (priority_function(mpnn, datapoint), datapoint) for datapoint in additional_data\n",
    "    ]\n",
    "    sorted_remaining_data = [\n",
    "        datapoint\n",
    "        for unc, datapoint in sorted(priority_remaining_data, key=lambda d: d[0], reverse=True)\n",
    "    ]\n",
    "\n",
    "    new_data = sorted_remaining_data[:query_size]\n",
    "    additional_data = additional_data[query_size:]\n",
    "\n",
    "    request_labels(new_data)\n",
    "    trainval_data.extend(new_data)\n",
    "\n",
    "    train_loader, val_loader, scaler = get_dataloaders(trainval_data)\n",
    "\n",
    "    mpnn = get_mpnn(scaler)\n",
    "    trainer.fit(mpnn, train_loader, val_loader)\n",
    "\n",
    "    result = trainer.test(mpnn, test_loader)\n",
    "    results.append((len(trainval_data), result[0][\"test/mse\"]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally we can view the results. The model's performance will hopefully improve with each iteration of active learning. Though this notebook is just an example. We didn't train the model for many epochs, and we used a very small dataset, so we don't expect to see the model improve. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(20, 1.2045652866363525),\n",
       " (30, 0.9172996282577515),\n",
       " (40, 1.0593369007110596),\n",
       " (50, 1.151768445968628),\n",
       " (60, 1.2037131786346436),\n",
       " (70, 1.1304174661636353),\n",
       " (80, 1.0078696012496948),\n",
       " (90, 0.9942679405212402)]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAK7CAYAAAAQv1z7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACTKklEQVR4nOzdd3iV9f3/8dd9TvYke0BIwt6IbBAFB8qqfq3VasGB1lrbb7W0vyraVm1t1bZWa5114SqOr1tAQGUpiDLC3oSZhJC957l/f5ycA5FhAknuM56P68p1lXPuk/POXUxefPL+vD+GaZqmAAAAAB9ls7oAAAAAoD0ReAEAAODTCLwAAADwaQReAAAA+DQCLwAAAHwagRcAAAA+jcALAAAAn0bgBQAAgE8j8AIAAMCnEXgBeIQnnnhChmFowIABZ/w5cnJydP/99ysrK+uE5+6//34ZhnEWFZ6ZOXPmyDAM7du3r8Pfu7UMw9D9999vdRke4bv3YuvWrbr//vu94v9HACci8ALwCC+99JIkacuWLVq9evUZfY6cnBw98MADJw28t9xyi1atWnU2Jfq8VatW6ZZbbrG6DI+0detWPfDAAwRewEsReAFYbs2aNdqwYYOmTJkiSXrxxRfb/D26dOmiUaNGtfnn9VT19fVqaGho1WtGjRqlLl26tFNFrdPY2Kja2lqrywDgIwi8ACznCrgPP/ywxowZozfffFNVVVUnXHf48GHdeuutSktLU1BQkFJTU3XVVVfpyJEjWrp0qYYPHy5Juummm2QYRrNfS3+3peGKK65Qenq6HA7HCe8zcuRInXvuue4/m6app59+Wuecc45CQ0MVExOjq666Snv37j3jr/mzzz7TRRddpKioKIWFhWns2LH6/PPPm12ze/du3XTTTerZs6fCwsLUuXNnTZs2TZs2bWp23dKlS2UYhl577TX95je/UefOnRUcHKzdu3frxhtvVEREhHbv3q3JkycrIiJCaWlp+s1vfnNCoPzur/Fd7RhLlizRz3/+c8XHxysuLk5XXnmlcnJymr22trZWv/nNb5ScnKywsDCdf/75Wrt2rTIyMnTjjTee9l7s27dPhmHob3/7mx588EFlZmYqODhYS5YskeT8B9EPfvADxcbGKiQkREOGDNHbb7/d7HNUVVXpt7/9rTIzMxUSEqLY2FgNGzZMc+fOdV8zfvx4jR8//oT3v/HGG5WRkXHK+ubMmaMf/ehHkqQJEya4/27NmTNHkrR+/XpNnTpViYmJCg4OVmpqqqZMmaJDhw6d9usG0HEIvAAsVV1drblz52r48OEaMGCAZs6cqfLycr3zzjvNrjt8+LCGDx+u999/X7NmzdKCBQv0+OOPKzo6WsXFxTr33HP18ssvS5J+//vfa9WqVaf9Ff3MmTN14MABffHFF80e3759u7755hvddNNN7sd+9rOf6c4779TFF1+sDz74QE8//bS2bNmiMWPG6MiRI63+ml9//XVNnDhRUVFReuWVV/T2228rNjZWl156abPQm5OTo7i4OD388MP69NNP9dRTTykgIEAjR47Ujh07Tvi8s2fP1oEDB/Tss8/q448/VmJioiTnau8PfvADXXTRRfrwww81c+ZMPfbYY3rkkUdaVO8tt9yiwMBA/fe//9Xf/vY3LV26VNOnT292zU033aTHH39cN910kz788EP98Ic/1P/8z/+opKSkxffliSee0BdffKF//OMfWrBggfr06aMlS5Zo7NixKikp0bPPPqsPP/xQ55xzjq655hp34JSkWbNm6ZlnntGvfvUrffrpp3rttdf0ox/9SIWFhS1+/1OZMmWK/vrXv0qSnnrqKfffrSlTpqiyslKXXHKJjhw5oqeeekqLFy/W448/rq5du6q8vPys3xtAGzEBwEKvvvqqKcl89tlnTdM0zfLycjMiIsIcN25cs+tmzpxpBgYGmlu3bj3l5/r2229NSebLL798wnP33Xefefy3vPr6ejMpKcm87rrrml33u9/9zgwKCjILCgpM0zTNVatWmZLMRx99tNl1Bw8eNENDQ83f/e53p/36Xn75ZVOSmZ2dbZqmaVZWVpqxsbHmtGnTml3X2NhoDh482BwxYsQpP1dDQ4NZV1dn9uzZ0/z1r3/tfnzJkiWmJPP8888/4TU33HCDKcl8++23mz0+efJks3fv3s0ek2Ted999J9R+++23N7vub3/7mynJzM3NNU3TNLds2WJKMu+6665m182dO9eUZN5www2n/JpM0zSzs7NNSWb37t3Nurq6Zs/16dPHHDJkiFlfX9/s8alTp5opKSlmY2OjaZqmOWDAAPOKK6447ftccMEF5gUXXHDC4zfccIOZnp7e7LHv3ot33nnHlGQuWbKk2XVr1qwxJZkffPDBad8bgLVY4QVgqRdffFGhoaH68Y9/LEmKiIjQj370I61YsUK7du1yX7dgwQJNmDBBffv2bZP3DQgI0PTp0/Xee++ptLRUkrNv9LXXXtPll1+uuLg4SdInn3wiwzA0ffp0NTQ0uD+Sk5M1ePBgLV26tFXvu3LlShUVFemGG25o9vkcDocuu+wyffvtt6qsrJQkNTQ06K9//av69eunoKAgBQQEKCgoSLt27dK2bdtO+Nw//OEPT/qehmFo2rRpzR4bNGiQ9u/f36Kaf/CDH5zwWknu1y9btkySdPXVVze77qqrrlJAQECL3sP1PoGBge4/7969W9u3b9dPfvITSWp2vyZPnqzc3Fz3SveIESO0YMEC3X333Vq6dKmqq6tb/L5no0ePHoqJidFdd92lZ599Vlu3bu2Q9wXQOgReAJbZvXu3li9frilTpsg0TZWUlKikpERXXXWVpGOTGyTp6NGjbb6haubMmaqpqdGbb74pSVq4cKFyc3ObtTMcOXJEpmkqKSlJgYGBzT6+/vprFRQUtOo9XS0QV1111Qmf75FHHpFpmioqKpLk/DX9H/7wB11xxRX6+OOPtXr1an377bcaPHjwSQNdSkrKSd8zLCxMISEhzR4LDg5WTU1Ni2p2hf/jXyvJXYOrbSApKanZdQEBASe89nS+W7/rXv32t7894V7dfvvtkuS+/0888YTuuusuffDBB5owYYJiY2N1xRVXNPtHU3uIjo7WsmXLdM455+iee+5R//79lZqaqvvuu0/19fXt+t4AWq7l//QGgDb20ksvyTRN/d///Z/+7//+74TnX3nlFT344IOy2+1KSEho801A/fr104gRI/Tyyy/rZz/7mV5++WWlpqZq4sSJ7mvi4+NlGIZWrFjhDnrHO9ljpxMfHy9J+ve//33KqRGu4Pj666/r+uuvd/ePuhQUFKhTp04nvM6KOcPSsUB85MgRde7c2f14Q0NDq3pov1u/617Nnj1bV1555Ulf07t3b0lSeHi4HnjgAT3wwAM6cuSIe7V32rRp2r59uyQpJCTEvZp/vNb+o+W7Bg4cqDfffFOmaWrjxo2aM2eO/vSnPyk0NFR33333WX1uAG2DwAvAEo2NjXrllVfUvXt3vfDCCyc8/8knn+jRRx/VggULNHXqVE2aNEmvvfaaduzY4Q453/XdlceWuOmmm/Tzn/9cX375pT7++GPNmjVLdrvd/fzUqVP18MMP6/Dhwyf8yv5MjB07Vp06ddLWrVv1y1/+8rTXGoZxQqCeN2+eDh8+rB49epx1LW3l/PPPlyS99dZbzaZb/N///V+rR6Mdr3fv3urZs6c2bNhwQug/naSkJN14443asGGDHn/8cVVVVSksLEwZGRl65513VFtb676vhYWFWrlypaKiok77OVvyd8swDA0ePFiPPfaY5syZo3Xr1rW4ZgDti8ALwBILFixQTk6OHnnkkZOOihowYICefPJJvfjii5o6dar+9Kc/acGCBTr//PN1zz33aODAgSopKdGnn36qWbNmqU+fPurevbtCQ0P1xhtvqG/fvoqIiFBqaqpSU1NPWce1116rWbNm6dprr1Vtbe0JI7TGjh2rW2+9VTfddJPWrFmj888/X+Hh4crNzdWXX36pgQMH6uc//3mLv+6IiAj9+9//1g033KCioiJdddVVSkxM1NGjR7VhwwYdPXpUzzzzjCRn2J4zZ4769OmjQYMGae3atfr73//uMbNyXfr3769rr71Wjz76qOx2uy688EJt2bJFjz76qKKjo2WznXn33HPPPadJkybp0ksv1Y033qjOnTurqKhI27Zt07p169zTPEaOHKmpU6dq0KBBiomJ0bZt2/Taa69p9OjRCgsLkyTNmDFDzz33nKZPn66f/vSnKiws1N/+9rfvDbuS3CcA/uc//1FkZKRCQkKUmZmpVatW6emnn9YVV1yhbt26yTRNvffeeyopKdEll1xyxl83gDZm5Y45AP7riiuuMIOCgsz8/PxTXvPjH//YDAgIMPPy8kzTdE5GmDlzppmcnGwGBgaaqamp5tVXX20eOXLE/Zq5c+eaffr0MQMDA5vttP/ulIbjXXfddaYkc+zYsaes5aWXXjJHjhxphoeHm6GhoWb37t3N66+/3lyzZs1pv87vTmlwWbZsmTllyhQzNjbWDAwMNDt37mxOmTLFfOedd9zXFBcXmzfffLOZmJhohoWFmeedd565YsWKE6YNuKY0HP9alxtuuMEMDw8/4fGT3Q+dYkrDt99+2+w61/sdP7GgpqbGnDVrlpmYmGiGhISYo0aNMletWmVGR0c3myhxMq4pDX//+99P+vyGDRvMq6++2kxMTDQDAwPN5ORk88ILL3RP9jBN07z77rvNYcOGmTExMWZwcLDZrVs389e//rV72obLK6+8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",
      "text/plain": [
       "<Figure size 800x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(8, 8))\n",
    "ax = fig.add_subplot(1, 1, 1)\n",
    "ax.set_title(\"Active learning results\")\n",
    "ax.set_xlabel(\"Train/Validation pool size\")\n",
    "ax.set_ylabel(\"MSE\")\n",
    "\n",
    "ax.plot([a[0] for a in results], [a[1] for a in results])\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "chemprop",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
